/*
 * PlanView.java 28 oct 2008
 *
 * Sweet Home 3D, Copyright (c) 2008 Emmanuel PUYBARET / eTeks <info@eteks.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
package com.eteks.sweethome3d.viewcontroller;

import java.util.List;

import com.eteks.sweethome3d.model.DimensionLine;
import com.eteks.sweethome3d.model.Selectable;
import com.eteks.sweethome3d.model.TextStyle;

/**
 * The view that displays the plan of a home.
 * @author Emmanuel Puybaret
 */
public interface PlanView extends View
{
	/**
	 * The cursor types available in plan view.
	 */
	public enum CursorType
	{
		SELECTION, PANNING, DRAW, ROTATION, ELEVATION, HEIGHT, POWER, RESIZE, DUPLICATION, MOVE
	}
	
	/**
	 * Sets rectangle selection feedback coordinates. 
	 */
	public abstract void setRectangleFeedback(float x0, float y0, float x1, float y1);
	
	/**
	 * Ensures selected items are visible at screen and moves
	 * scroll bars if needed.
	 */
	public abstract void makeSelectionVisible();
	
	/**
	 * Ensures the point at (<code>x</code>, <code>y</code>) is visible,
	 * moving scroll bars if needed.
	 */
	public abstract void makePointVisible(float x, float y);
	
	/**
	 * Returns the scale used to display the plan.
	 */
	public abstract float getScale();
	
	/**
	 * Sets the scale used to display the plan.
	 */
	public abstract void setScale(float scale);
	
	/**
	 * Moves the view from (dx, dy) unit in the scrolling zone it belongs to.
	 */
	public abstract void moveView(float dx, float dy);
	
	/**
	 * Returns <code>x</code> converted in model coordinates space.
	 */
	public abstract float convertXPixelToModel(int x);
	
	/**
	 * Returns <code>y</code> converted in model coordinates space.
	 */
	public abstract float convertYPixelToModel(int y);
	
	/**
	 * Returns <code>x</code> converted in screen coordinates space.
	 */
	public abstract int convertXModelToScreen(float x);
	
	/**
	 * Returns <code>y</code> converted in screen coordinates space.
	 */
	public abstract int convertYModelToScreen(float y);
	
	/**
	 * Returns the length in centimeters of a pixel with the current scale.
	 */
	public abstract float getPixelLength();
	
	/**
	 * Returns the coordinates of the bounding rectangle of the <code>text</code> displayed at
	 * the point (<code>x</code>,<code>y</code>).  
	 */
	public abstract float[][] getTextBounds(String text, TextStyle style, float x, float y, float angle);
	
	/**
	 * Sets the cursor of this component as rotation cursor. 
	 */
	public abstract void setCursor(CursorType cursorType);
	
	/**
	 * Sets tool tip text displayed as feedback. 
	 * @param toolTipFeedback the text displayed in the tool tip 
	 *                    or <code>null</code> to make tool tip disappear.
	 */
	public abstract void setToolTipFeedback(String toolTipFeedback, float x, float y);
	
	/**
	 * Set properties edited in tool tip.
	 */
	public abstract void setToolTipEditedProperties(PlanController.EditableProperty[] toolTipEditedProperties,
			Object[] toolTipPropertyValues, float x, float y);
	
	/**
	 * Deletes tool tip text from screen. 
	 */
	public abstract void deleteToolTipFeedback();
	
	/**
	 * Sets whether the resize indicator of selected wall or piece of furniture 
	 * should be visible or not. 
	 */
	public abstract void setResizeIndicatorVisible(boolean resizeIndicatorVisible);
	
	/**
	 * Sets the location point for alignment feedback.
	 */
	public abstract void setAlignmentFeedback(Class<? extends Selectable> alignedObjectClass, Selectable alignedObject,
			float x, float y, boolean showPoint);
	
	/**
	 * Sets the points used to draw an angle in plan view.
	 */
	public abstract void setAngleFeedback(float xCenter, float yCenter, float x1, float y1, float x2, float y2);
	
	/**
	 * Sets the feedback of dragged items drawn during a drag and drop operation, 
	 * initiated from outside of plan view.
	 */
	public abstract void setDraggedItemsFeedback(List<Selectable> draggedItems);
	
	/**
	 * Sets the given dimension lines to be drawn as feedback.
	 */
	public abstract void setDimensionLinesFeedback(List<DimensionLine> dimensionLines);
	
	/**
	 * Deletes all elements shown as feedback.
	 */
	public abstract void deleteFeedback();
	
	/**
	 * Returns the component used as an horizontal ruler for this plan.
	 */
	public abstract View getHorizontalRuler();
	
	/**
	 * Returns the component used as a vertical ruler for this plan.
	 */
	public abstract View getVerticalRuler();
	
	/**
	 * Returns <code>true</code> if this plan accepts to import dragged items at the given coordinates.
	 */
	public abstract boolean canImportDraggedItems(List<Selectable> items, int x, int y);
}
